﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public Class ObjektTextbox
    Inherits Objekt2D

    Dim TextAnzeiger As ObjektText
    Dim GeschriebenerText As String = ""
    Dim Frame2 As Integer = 0
    Dim Buchstabenbreite As Integer = 0

    Dim Buchstabenhoehe As Integer
    ''' <summary>
    ''' 0 bedeutet der Text wird ganz am Anfang eingefuegt 1 bedeutet nach dem ersten Buchstaben.
    ''' </summary>
    ''' <remarks></remarks>
    Dim Cursorposition As Integer = 0
    Dim Buchstabenzahl As Integer = 0
    Dim BuchstabenStart As Integer = 0
    ''' <summary>
    ''' Momentan machen wir nur eine Zeile ansonsten waere das hier um einiges Komplizierter
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Breite"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Breite As Integer, ByVal Fixed As PointF, Optional ByVal Handler As ObjektPanel = Nothing)
        MyBase.New("Textbox", New Rectangle(X + 2, Y, Breite, 21), New Point(X, Y), Fixed, Handler)
        TextAnzeiger = New ObjektText(New String() {}, X + 2, Y + 1, Nothing, Schriftengine.Schriftarten.Courier_New, 14, FontStyle.Regular)
        Grafikengine.Sprite.Transform = Matrix.Identity
        Buchstabenbreite = TextAnzeiger.GetSchriftart.MeasureString(Grafikengine.Sprite, "A", Microsoft.DirectX.Direct3D.DrawTextFormat.None, Color.Black).Width
        Buchstabenhoehe = TextAnzeiger.GetSchriftart.MeasureString(Grafikengine.Sprite, "A", Microsoft.DirectX.Direct3D.DrawTextFormat.None, Color.Black).Height
        Buchstabenzahl = Math.DivRem(Breite, Buchstabenbreite, 0)
    End Sub

    Public Overrides Function Keydown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean
        If IsVisble() Then
            If Focused Then
                Select Case e.KeyCode
                    Case Keys.Back
                        'Wenn was geloescht wird dann nur wenn was zu loeschen da ist
                        If Cursorposition > 0 Then
                            'Wir wollen was loeschen.
                            GeschriebenerText = GeschriebenerText.Remove(Cursorposition - 1, 1)
                            Cursorposition -= 1
                        End If
                    Case Keys.Left
                        If Cursorposition > 0 Then Cursorposition -= 1
                    Case Keys.Right
                        If Cursorposition < GeschriebenerText.Length Then Cursorposition += 1
                    Case Keys.Delete
                        If Cursorposition < GeschriebenerText.Length Then
                            GeschriebenerText = GeschriebenerText.Remove(Cursorposition, 1)
                        End If
                    Case Keys.Enter
                        Me.RemoveFocus()
                End Select

                'Wir schauen ob wir auch wirklich eine Eingabe mit Buchstaben gemacht haben
                Return True
            End If
            ShiftText()
        End If
        Return False
    End Function
    Public Overrides Function KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean

    End Function
    Public Overrides Function MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) As Boolean
        If IsVisble() Then
            If (Not HasFocus) Or Focused Then
                'wir haben auf dieses Textfeld geklickt.
                Dim R As New Rectangle(GetRealX, GetRealY, Rechteck.Width, Rechteck.Height)
                If R.Contains(e.Location) Then
                    Focus()
                    Hauptmenue.MainMenue.txtChatbox.Text = ""
                    Hauptmenue.MainMenue.txtChatbox.Focus()
                    Cursorposition = Math.DivRem(e.X - GetRealX() - 2 + 5, Buchstabenbreite, 0) + BuchstabenStart
                    If Cursorposition < 0 Then Cursorposition = 0
                    If Cursorposition > GeschriebenerText.Length Then Cursorposition = GeschriebenerText.Length
                Else

                    Me.RemoveFocus()
                End If
            End If
        End If
    End Function
    Public Overrides Function MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) As Boolean

    End Function
    Public Overrides Function MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) As String
        Return ""
    End Function
    ''' <summary>
    ''' Sorgt dafuer, dass zu langer Text fuer die Textbox auch richtig angezeigt wird sprich abgeschnitten wird
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ShiftText()
        'Nur jetzt muessen wir berechnen
        If GeschriebenerText.Length > Buchstabenzahl Then
            'Das hier ist jetzt nur eine Notloesung
            BuchstabenStart = Cursorposition - Math.DivRem(Buchstabenzahl, 2, 0)
            If BuchstabenStart < 0 Then
                BuchstabenStart = 0
            ElseIf GeschriebenerText.Length - Buchstabenzahl < BuchstabenStart Then
                BuchstabenStart = GeschriebenerText.Length - Buchstabenzahl
            End If
        Else
            BuchstabenStart = 0
        End If
    End Sub
    Public Overrides Sub RemoveFocus()
        If Focused Then
            Hauptmenue.MainMenue.Focus()
            MyBase.RemoveFocus()
        End If
    End Sub
    Public Sub SetText(ByVal Text As String)
        GeschriebenerText = Text
        SetTextPosZumEnde()
    End Sub
    Public Overrides Sub Malen()
        If Handler IsNot Nothing Then
            If Not Handler.IsVisible(New Rectangle(Koordinaten.X, Koordinaten.Y, Rechteck.Width + 2, Rechteck.Height), True) Then
                Exit Sub
            End If
        End If
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        Dim P As Point = GetRealKoordinaten()
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        Grafikengine.ptfPosition = P
        'Zuerst malen wir den linken Rand
        With Grafikengine.recBild
            .X = 0 : .Width = 2
            .Y = 0 : .Height = 21
        End With
        Grafikengine.Sprite.Draw2D(Textur.getTextur(TexturID), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        'Jetzt den rechten Rand
        Grafikengine.ptfPosition.X += Rechteck.Width + 2
        Grafikengine.recBild.X = 23
        Grafikengine.Sprite.Draw2D(Textur.getTextur(TexturID), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        'und jetzt die Mitte
        Grafikengine.ptfPosition.X = P.X + 2
        With Grafikengine.recBild
            .X = 2 : .Width = 21
            .Y = 0 : .Height = 21
        End With
        Grafikengine.szfScale.Width = Rechteck.Width
        Grafikengine.szfScale.Height = 21
        Grafikengine.Sprite.Draw2D(Textur.getTextur(TexturID), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Dim AnzeigeText As String = ""
        If GeschriebenerText.Length >= BuchstabenStart Then
            AnzeigeText = GeschriebenerText.Remove(0, BuchstabenStart)
            If Buchstabenzahl < AnzeigeText.Length Then
                AnzeigeText = AnzeigeText.Remove(Buchstabenzahl)
            End If

            TextAnzeiger.neuerText(New String() {AnzeigeText}, 2 + P.X, 1 + P.Y, Nothing)
            'Wir malen den Text.
            TextAnzeiger.Malen(New Point)
        End If
        If Focused Then
            'Wir muessen jetzt diesen | malen
            Frame2 += 1
            If Frame2 > 11 Then Frame2 = 0
            If Frame2 < 6 Then
                Dim Pos As Integer = Cursorposition - BuchstabenStart
                Grafikengine.fillRect(New Rectangle(Pos * Buchstabenbreite + 2 + P.X, +2 + P.Y, 1, 17), Color.Black)
            End If
        End If
        If Cursorposition - BuchstabenStart > AnzeigeText.Length Then
            Cursorposition = AnzeigeText.Length
        End If
        NextFrame()
    End Sub
    ''' <summary>
    ''' Uebergibt den Text an diese Textbox
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub NextFrame()
        If Focused Then
            Hauptmenue.ChatboxLocker.Lock()
            Dim Text As String = Hauptmenue.MainMenue.txtChatbox.Text
            Dim Laenge As Integer = Text.Length
            If Laenge > 0 Then
                GeschriebenerText = GeschriebenerText.Insert(Cursorposition, Text)
                Hauptmenue.MainMenue.txtChatbox.Text = ""
                Cursorposition += Laenge
            End If
            Hauptmenue.ChatboxLocker.Unlock()
            ShiftText()
        End If
    End Sub
    Public Overrides Sub RemoveHandles()
        Me.RemoveFocus()
        MyBase.RemoveHandles()
    End Sub
    Public Function GetText() As String
        Return GeschriebenerText.Trim
    End Function
    Public Sub SetTextPosZumEnde()
        If GeschriebenerText.Length > Buchstabenzahl Then
            BuchstabenStart = GeschriebenerText.Length - Buchstabenzahl
        Else
            BuchstabenStart = 0
        End If
    End Sub
    Public Overrides Sub ChangeWindowSize(ByVal PosChange As System.Drawing.Point)
        MyBase.ChangeWindowSize(PosChange)
        Bildgroesse.X += PosChange.X * Fixed.X
        Bildgroesse.Y += PosChange.Y * Fixed.Y
    End Sub

    Public Overloads Overrides Function MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) As Boolean

    End Function
End Class
